/**
 * @file ConfigChanger.h
 * @author Jakub Trzaskoma
 *
 * Klasa odpowiadiadająca za zdalną zmianę aktualnego pliku konfiguracjnego poprzez port TCP.
 * Weryfikacja uprawnień użytkownika odbywa się za pomocą hasła.
 * Zalecane użycie za pomoca polecenia "netcat [adres IP serwera][port TCP nasłuchu serwera]"
 * Po połązceniu należy postąpować zgodnie z komunikatami odebranymi od serwera.
 *
 * Przykład użycia:
 * <BR />
 * user@localhost:~> netcat 192.168.1.2 2002 <BR />
 * Config Changer for tftp server. Enter password: <BR />
 * pass <BR />
 * Access granted. <BR />
 * Enter config filename to load: <BR />
 * filelist2.txt <BR />
 * Config successfully loaded. <BR />
 * (Ctrl+c) <BR />
 * user@localhost:~>
 */

#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <pthread.h>
#include <string.h>

#ifndef CONFIGCHANGER_H_
#define CONFIGCHANGER_H_

namespace tftp_server
    {
    /**
     * @class ConfigChanger
     * Klasa odpowiadiadająca za zdalną zmiane aktualnego pliku konfiguracjnego poprzez port TCP i hasło.
     */
    class ConfigChanger
	{
    private:
	/**
	 * Metoda pomocnicza umożliwiająca uruchowmienie metody run() w osobnym wątku.
	 * @param arg_ - wskaźnik na strukturę z argumentami niezbędnymi to późniejszego przekazania do metody run().
	 */
	static void *runFunc(void * arg);
	/**
	 * Metoda wysyłąjąca pakiet danych do klienta.
	 * @param sock_ - gniazdo serwera które ma zostać użyte do wysłania danych.
	 * @param buff_ - bufor do wysłania.
	 * @param size_ - rozmiar wysyłanego bufora.
	 * @return 0 - jeśli pobrano tylko znak nowego wiersza
	 */
	int send(int sock_, char* buff_, int size_);
	/**
	 * Metoda odbierająca pakiet danych od klienta.
	 * @param sock_ - gniazdo serwera które ma zostać użyte do odbierania danych.
	 * @param buff_ - bufor do przechowania odebranych danych.
	 * @return 0 - jeśli pobrano tylko znak nowego wiersza
	 */
	int receive(int sock_, char* buff_);
	/**
	 * Metoda porównująca dwa ciągi znaków.
	 * Przy porównywaniu nie są brane pod uwagę znaki nowego wiersza i znak końca "0".
	 * @param left_ - pierwszy porównywany ciąg znaków
	 * @param right_ - drugi porównywany ciąg znaków
	 * @return true - jeśli pobrano porównywane ciągi są identyczne
	 */
	bool compare(char* left_, char* right_);
	/**
	 * Metoda wyodrębniająca nazwę pliku z bufora.
	 * Wyodębnianie kończy sie po napotkaniu znaku nowego wiersza.
	 * Następnie dostawiany jest znak końca "0".
	 * @param buff_ - przeszukiwany bufor.
	 * @param filename_ - wyodrębniona nazwa pliku.
	 */
	void getFilename(char *buff_, char *filename_);
	/**
	 * Zmienna przechowująca informację o wątku.
	 */
	int threadHandle;
	/**
	 * Gniazdo nasłuchu serwera.
	 */
	int sock;
	/**
	 * Numer wątku.
	 */
	pthread_t threadId;

    public:
	/**
	 * Kostruktor bezargumentowy.
	 */
	ConfigChanger();
	/**
	 * Destruktor klasy.
	 */
	~ConfigChanger();
	/**
	 * Konstruktor pobiera inforamcje o porcie na jakim ma działać serwer oraz haśle dostępu.
	 * @param arg_ - zmienna pomocnicza aktywująca wątek
	 * @param port_ -  port na jakim ma nasłuchiwać serwer
	 * @param password_ - hasło do połączenie się z serwerem w celu zminy configa
	 */
	ConfigChanger(bool arg_, int port_, const char* password_);
	/**
	 * Metoda uruchamiająca nasłuch serwera na wskazanym porcie.
	 * @param port_ -  port na jakim ma nasłuchiwać serwer
	 * @param password_ - hasło do połączenia się z serwerem w celu zminy pliku konfiguracyjnego
	 */
	void run(int port_, char* password_);
	};

    }

#endif /* CONFIGCHANGER_H_ */
